gusucode.com > VC++ EMF图片浏览器(可读emf、wmf、emz、wmz、png……等)-源码程序 > VC++ EMF图片浏览器(可读emf、wmf、emz、wmz、png……等)-源码程序/code/Src/Client/scwinlib/SCImgStatic.cpp

    //Download by http://www.NewXing.com
/*
*	This file is part of the EMFexplorer projet.
*	Copyright (C) 2004 Smith Charles.
*
*	This library is free software; you can redistribute it and/or
*	modify it under the terms of the GNU Lesser General Public
*	License as published by the Free Software Foundation; either
*	version 2.1 of the License, or (at your option) any later version.
*
*   This library is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*   Lesser General Public License for more details.
*
*   You should have received a copy of the GNU Lesser General Public
*   License along with this library; if not, write to the Free Software
*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
*
*	Extension: for commercial use, apply the Equity Public License, which
*	adds to the normal terms of the GLPL a condition of donation to the author.
*   If you are interested in support for this source code,
*   contact Smith Charles <smith.charles@free.fr> for more information.
*/


#include "stdafx.h"
#include "SCImgStatic.h"

//	#ifdef _DEBUG
//	#define new DEBUG_NEW
//	#undef THIS_FILE
//	static char THIS_FILE[] = __FILE__;
//	#endif

/////////////////////////////////////////////////////////////////////////////
// CSCImgStatic

CSCImgStatic::CSCImgStatic()
	:m_pImage(NULL),
	m_fWidth(0),
	m_fHeight(0)
{
}

CSCImgStatic::~CSCImgStatic()
{
	if (m_pImage)
		delete m_pImage;
}


BEGIN_MESSAGE_MAP(CSCImgStatic, CStatic)
	//{{AFX_MSG_MAP(CSCImgStatic)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSCImgStatic message handlers

void CSCImgStatic::OnPaint() 
{
	using namespace Gdiplus;

	CPaintDC dc(this); // device context for painting

	// getting rect of static
	CRect rect;
	GetClientRect(&rect);
	dc.PatBlt(rect.left, rect.top, rect.right, rect.bottom, WHITENESS);

	if (!m_pImage)
		return;
		
	REAL xPos = rect.left + (rect.Width() - m_fWidth)/2;
	REAL yPos = rect.top + (rect.Height() - m_fHeight)/2;

	// Image
	Graphics graphics(dc.GetSafeHdc());
	graphics.DrawImage(m_pImage, xPos, yPos, m_fWidth, m_fHeight);

	// Border
	Color PenColor(255, 0, 0, 0);
	Pen pen(PenColor, 1.0);
	Rect rcBorder(rect.left, rect.top, rect.Width()-1, rect.Height()-1);
	graphics.DrawRectangle(&pen, rcBorder);
}

BOOL CSCImgStatic::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

void CSCImgStatic::SCSetEMF(HENHMETAFILE hemf)
{
	using namespace Gdiplus;

	if (m_pImage)
		delete m_pImage;
	if (!hemf)
	{
		m_pImage = NULL;
		Invalidate();
		return;
	}
	m_pImage = new Metafile(hemf);

	REAL fScaleXY = (REAL)m_pImage->GetWidth()/(REAL)m_pImage->GetHeight();

	CRect rect;
	GetClientRect(&rect);
	m_fHeight = (REAL)rect.Height();
	m_fWidth = m_fHeight*fScaleXY;
	if (m_fWidth>rect.Width())
	{
		m_fWidth = (REAL)rect.Width();
		m_fHeight = m_fWidth/fScaleXY;
	}
	Invalidate();
}